package com.cms.recursoshumanos.activity.catalogo;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import com.example.frontendrecursoshumanos.R;
import com.cms.recursoshumanos.activity.main.MainRecursosHumanosActivity;
import com.cms.recursoshumanos.cache.CarritoCompraCache;
import com.cms.recursoshumanos.cache.ListaArticuloCache;
import com.cms.recursoshumanos.cache.ListaTipoArticuloCache;
import com.cms.recursoshumanos.cache.UserInfoCache;
import com.cms.recursoshumanos.component.dialog.CustomAddArticuloDialog;
import com.cms.recursoshumanos.component.dialog.CustomAddArticuloDialog.AddDialogListener;
import com.cms.recursoshumanos.constant.Constant;
import com.cms.recursoshumanos.handler.ImagenesHandler;
import com.cms.recursoshumanos.handler.ListaArticuloCatalogoActivityHandler;
import com.cms.recursoshumanos.object.Articulo;
import com.cms.recursoshumanos.object.Usuario;
import com.cms.recursoshumanos.object.list.ListaArticulo;
import com.cms.recursoshumanos.utilities.Tool;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class ListaArticuloActivity extends MainRecursosHumanosActivity 
{

	private static CatalogoAdapter adaptador;
	private static ListView listViewArticulo;
	private static ListaArticulo lista_total;
	private static ListaArticulo lista_filtro;
	
	private static LinearLayout layout_title_menu;
	private static TextView categoria_articulo_view;
	private static TextView cantidad_articulo_view;

	private static EditText buscador;
	private static String nombre_categoria;
	private static int filtro;
	
	private Usuario elUsuario;
	private ListaArticuloAsync asyncListaArticuloTask;
	
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_lista_articulo);
		elUsuario = UserInfoCache.getInstance().getUsuario();
		Bundle bundle = getIntent().getExtras();
		filtro = Integer.parseInt(bundle.getString("id_tipo_articulo"));
		lista_total = ListaArticuloCache.getInstance().getListaArticulo();
		lista_filtro = this.getListadoFiltro();
		if (filtro == 0)
		{
			nombre_categoria = "Todas las Categorias";
		}
		else
		{
			nombre_categoria = ListaTipoArticuloCache.getInstance().
								getListaTipoArticulo().
								getTipoArticuloAtIndex(filtro).
								getNombreTipoArticulo();
		}
		
		setCompenents();
	}
	@Override
	protected void onResume() 
	{
		super.onResume();
		
		if (lista_total == null)
		{
			goPaginaPrincipal(ListaArticuloActivity.this);
		}
		if (lista_filtro == null)
		{
			goPaginaPrincipal(ListaArticuloActivity.this);
		}
		if (elUsuario == null)
		{	
			elUsuario = UserInfoCache.getInstance().getUsuario();
		}
	}
	
	
	
	public void onRefreshClick(View v)
	{
		refreshListaArticulo();
	}
	public void refreshListaArticulo()
	{
		asyncListaArticuloTask = new ListaArticuloAsync(elUsuario);
		asyncListaArticuloTask.execute();
		
	}
	public void setCompenents()
	{
		listViewArticulo =  (ListView)  findViewById ( R.id.lvArticulo );
		
		layout_title_menu = (LinearLayout) findViewById(R.id.llTituloListaArticulo);
		categoria_articulo_view = (TextView) layout_title_menu.findViewById(R.id.tvCategoriaArticulo);
		cantidad_articulo_view = (TextView) layout_title_menu.findViewById(R.id.tvCantidadArticulo);
		
		categoria_articulo_view.setText("Categoria: "+ nombre_categoria);
		cantidad_articulo_view.setText("Se Encontro: "+lista_filtro.cantElementListaArticulo()+" Registro(s).");
		
		buscador = (EditText) findViewById(R.id.etSearch);
		
		buscador.addTextChangedListener(new TextWatcher() 
		{

			   public void afterTextChanged(Editable s)
			   {
			   }

			   public void beforeTextChanged(CharSequence s, int start, int count, int after) 
			   {

			   }

			   public void onTextChanged(CharSequence s, int start, int before, int count) 
			   {
				   
				   int textlength = buscador.getText().length();
				   
				   if (textlength == 0)
				   {
					   setListadoCompleto();
				   }
				   else
				   {
					   setListadoParam();
				   }

			   }
		});
		setListadoCompleto();

	}
	
	public void setListadoCompleto()
	{
		categoria_articulo_view.setVisibility(View.VISIBLE);
		adaptador = new CatalogoAdapter(this, lista_filtro.getListaArticulo());
		cantidad_articulo_view.setText("Se encontraron "+	lista_filtro.cantElementListaArticulo()+	" registro(s).");
		listViewArticulo.setAdapter(adaptador);
	}
	public void setListadoParam()
	{
		
		categoria_articulo_view.setVisibility(View.GONE);
		int textlength = buscador.getText().length();
		List<Articulo> listado_articulo_mostrar = new ArrayList<Articulo>();
		   
		for (int i = 0; i < lista_filtro.cantElementListaArticulo(); i++) 
		{
			Articulo articulo_aux = lista_filtro.getArticuloAtIndex(i);
	   
			String nombre_articulo = ""+articulo_aux.getNombreArticulo();
	   
			if (textlength <= nombre_articulo.length()) 
			{
				if (buscador.getText().toString().equalsIgnoreCase(  (String) nombre_articulo.subSequence(0,textlength))) 
				{
					listado_articulo_mostrar.add(articulo_aux);
				}
			}
		}
		
		cantidad_articulo_view.setText("Se encontraron "+	listado_articulo_mostrar.size()+" registro(s).");
		adaptador = new CatalogoAdapter(this, listado_articulo_mostrar);
		listViewArticulo.setAdapter(adaptador);
	}
	
	public ListaArticulo getListadoFiltro()
	{
		
		ListaArticulo listado = new ListaArticulo();
				
		if (filtro == 0)
		{
			listado = lista_total;
		}
		else
		{
			listado = new ListaArticulo();
			for (int i = 0; i < lista_total.cantElementListaArticulo(); i++)
			{
				Articulo elArticulo = lista_total.getArticuloAtIndex(i);
				if (elArticulo.getTipoArticulo().getIdTipoArticulo() == filtro)
				{
					listado.addArticulo(elArticulo);
				}
			}
		}
		return listado;
		
	}
	public void goDetailArticulo(Articulo elArticulo)
	{
		Intent intent = new Intent(ListaArticuloActivity.this, DetailArticuloActivity.class);
		
		Bundle bundle = new Bundle();
		bundle.putString("id_articulo", ""+ elArticulo.getIdArticulo());
		intent.putExtras(bundle);
		
		startActivity(intent);
	}
	public void addArticuloCarrito(Articulo elArticulo, int cantidad_seleccionada)
	{
		CarritoCompraCache.getInstance().addArticuloToCarrito(elArticulo, 
																cantidad_seleccionada);
		Toast.makeText(getAppContext(), "Se Agrego el Articulo al Carrito Satisfactoriamente", Toast.LENGTH_LONG).show();
	}
	public void showPopUpAddCarrito(Articulo elArticulo)
	{
		CustomAddArticuloDialog dialog = new CustomAddArticuloDialog(ListaArticuloActivity.this,elArticulo, new AddDialogListener() 
		{
			
			@Override
			public void ready(Articulo elArticulo, int cantidad_selec) 
			{
				addArticuloCarrito(elArticulo,cantidad_selec);
			}
			
			@Override
			public void cancelled() 
			{
				// TODO Auto-generated method stub
				
			}
		});
		dialog.show();
	}
	public class CatalogoAdapter extends ArrayAdapter<Articulo> 
	{
	    LayoutInflater mInflater ;  
	    private List<Articulo> mItems ;
	    private ViewHolder holder;
	 
	    public CatalogoAdapter  ( Context context , List<Articulo> items)  
	    {
	        super ( context, -1, items )  ;
	        this.mItems = items ;
	        this.mInflater = LayoutInflater.from(context) ;
	    }
	    
	    @ Override
	    public View getView ( final int position, View convertView, ViewGroup parent )  
	    {
	            // Inflate the custom view
	    	/*View v = listViewArticulo.getChildAt(position - listViewArticulo.getFirstVisiblePosition());//convertView;
	    	if ( v == null)
    		{
    			v =   mInflater.inflate( R.layout.elementos_lista_objeto_2right_item,null);    		
        		v.setOnClickListener(new OnClickListener() 
        		{
    				
    				@Override
    				public void onClick(View v) 
    				{
    					goDetailArticulo(mItems.get(position));
    				}
    			});
        		
        		v.setOnLongClickListener(new OnLongClickListener() 
        		{
    				
    				@Override
    				public boolean onLongClick(View v) 
    				{
    					
    					showPopUpAddCarrito(mItems.get(position));
    					
    					return true;
    				}
    			});
    			
    			
    			holder = new ViewHolder();
	    		
	    		holder.relative_nombre_principal= (RelativeLayout) v.findViewById(R.id.rlNombreObjeto);
	    		holder.relative_nombre_right = (RelativeLayout) v.findViewById(R.id.rlNombreRightObjeto);
	    		
	    		holder.imagen_foto = (ImageView) v.findViewById(R.id.ivFotoObjeto);
				holder.progreso = (ProgressBar) v.findViewById(R.id.pBImagen);
	    		
	    		holder.tipoArticulo = (TextView) holder.relative_nombre_principal.findViewById(R.id.tvNombreDetalle);
	    		holder.nombreArticulo = (TextView) holder.relative_nombre_principal.findViewById(R.id.tvNombrePrincipal);

	    		holder.cantidadArticulo = (TextView) holder.relative_nombre_right.findViewById(R.id.tvNombreRight);
	    		holder.precioArticulo = (TextView) holder.relative_nombre_right.findViewById(R.id.tvDetalleRight);

	    		v.setTag(holder);
	    	}
	    	else
	    	{
	    		holder = (ViewHolder) v.getTag();
	    	}
	    	
	    	
    		
    		
    		holder.nombreArticulo.setText(mItems.get(position).getNombreArticulo());
    		holder.tipoArticulo.setText(mItems.get(position).getTipoArticulo().getNombreTipoArticulo());
    		
    		holder.cantidadArticulo.setText("Cant: "+mItems.get(position).getCantidadDisponible());
    		holder.precioArticulo.setText("BsF. "+mItems.get(position).getPrecioUnitario());
    		
    		holder.progreso.setVisibility(View.VISIBLE);
			holder.imagen_foto.setVisibility(View.INVISIBLE);
    		
			if (holder.imagen_foto != null)
    		{
    			if (mItems.get(position).getFotoArticulo() == null)
    			{
    				new DownloadImageTask(ListaArticuloActivity.this).execute(position);
    			}
    			else
    			{
    				holder.imagen_foto.setVisibility(View.VISIBLE);
					holder.progreso.setVisibility(View.INVISIBLE);
    				holder.imagen_foto.setImageBitmap(mItems.get(position).getFotoArticulo());
    			}
    		}
	        return v ;*/
	    	
	    	convertView =   mInflater.inflate( R.layout.elementos_lista_objeto_2right_item,null);    		
	    	convertView.setOnClickListener(new OnClickListener() 
    		{
				
				@Override
				public void onClick(View v) 
				{
					goDetailArticulo(mItems.get(position));
				}
			});
    		
    		convertView.setOnLongClickListener(new OnLongClickListener() 
    		{
				
				@Override
				public boolean onLongClick(View v) 
				{
					
					showPopUpAddCarrito(mItems.get(position));
					
					return true;
				}
			});
	    	
	    	if (convertView.getTag() == null)
	    	{
	    		holder = new ViewHolder();
	    		
	    		holder.imagen_foto = (ImageView) convertView.findViewById(R.id.ivFotoObjeto);
				holder.progreso = (ProgressBar) convertView.findViewById(R.id.pBImagen);
	    		
	    		holder.tipoArticulo = (TextView) convertView.findViewById(R.id.tvNombreDetalle);
	    		holder.nombreArticulo = (TextView) convertView.findViewById(R.id.tvNombrePrincipal);

	    		holder.cantidadArticulo = (TextView) convertView.findViewById(R.id.tvNombreRight);
	    		holder.precioArticulo = (TextView) convertView.findViewById(R.id.tvDetalleRight);
	    		holder.flag_buscar = true;

	    	}
	    	else
	    	{
	    		holder = (ViewHolder) convertView.getTag();
	    	}
    		
	    	
	    	holder.nombreArticulo.setText(mItems.get(position).getNombreArticulo());
    		holder.tipoArticulo.setText(mItems.get(position).getTipoArticulo().getNombreTipoArticulo());
    		
    		holder.cantidadArticulo.setText("Cant: "+mItems.get(position).getCantidadDisponible());
    		holder.precioArticulo.setText("BsF. "+mItems.get(position).getPrecioUnitario());
    		
    		holder.progreso.setVisibility(View.VISIBLE);
			holder.imagen_foto.setVisibility(View.GONE);
    		
			if (holder.imagen_foto != null)
			{
				if (mItems.get(position).getFotoArticulo() == null)
				{
					if (holder.flag_buscar) 
					{
						holder.flag_buscar = false;
						new DownloadImageTask(ListaArticuloActivity.this).execute(position);
					}
				}
				else
				{
					holder.imagen_foto.setVisibility(View.VISIBLE);
					holder.progreso.setVisibility(View.GONE);
    				holder.imagen_foto.setImageBitmap(mItems.get(position).getFotoArticulo());
				}
			}
			convertView.setTag(holder);
	        return convertView ;
	    	
	    }
	    private class ViewHolder 
	    { 
        	
        	ImageView imagen_foto;
			ProgressBar progreso;
    		TextView tipoArticulo;
    		TextView nombreArticulo;
    		TextView cantidadArticulo;
    		TextView precioArticulo;
    		boolean flag_buscar;
        }
	}
	
	private class ListaArticuloAsync extends AsyncTask<String, Void, String>
	{
		private ProgressDialog dialog;
		
		private Usuario elUsuario;
		
		public ListaArticuloAsync(Usuario elUsuario)
		{
			this.elUsuario = elUsuario;
		}

		@SuppressWarnings("deprecation")
		@Override
		protected void onPreExecute()
		{
			showDialog(0);
			dialog = ProgressDialog.show(ListaArticuloActivity.this, "Espere","Cargando...",true );
		}
	
		@Override
		protected String doInBackground(String... arg0) 
		{
			
			ListaArticuloCatalogoActivityHandler handler = new ListaArticuloCatalogoActivityHandler();
			String result = handler.getListaArticuloScreen(this.elUsuario.getNombre_Usuario(),
															this.elUsuario.getPassword());
			return result;
		}
		
		@Override
		public void onPostExecute(String  result)
		{
			
			String str_result = result;
			
			if (str_result.equals(Constant.CODE_OK))
			{ 
				lista_total = ListaArticuloCache.getInstance().getListaArticulo();
				lista_filtro = getListadoFiltro();
				setListadoCompleto();
			}
			else 
			{
				Tool.getInstance().showMessage(str_result);
			}
			dialog.cancel();
			this.cancel(true);
		}
	}
	
	private static class DownloadImageTask extends AsyncTask<Integer, Void, Bitmap> 
	{
		WeakReference<ListaArticuloActivity> context;
		@SuppressWarnings("unused")
		ListaArticuloActivity activity;
		int index;
	 
		public DownloadImageTask(ListaArticuloActivity activity) 
		{	
			context = new WeakReference<ListaArticuloActivity>(activity);
			this.activity = context.get();
		}
    	
		@Override
		protected Bitmap doInBackground(Integer... position) 
		{
			index = position[0];        	
			ImagenesHandler handler = new ImagenesHandler();
			Articulo elArticuloAux = (adaptador.getItem(index));
			return handler.GetImage(elArticuloAux.getUrlFoto());
		}
		
		@Override
		protected void onPostExecute(Bitmap poster) 
		{  
			/*View itemView = null;
			ImageView itetmImageView = null;
			int index_list_v = listViewArticulo.getFirstVisiblePosition();
			int index_real = index - index_list_v;
			Articulo elArticulo = lista_filtro.getArticuloAtIndex(index);
	        if(listViewArticulo != null)
	        {
        		itemView = listViewArticulo.getChildAt(index_real);
	        }
	        
	        if (itemView != null)
	        {
	        	itetmImageView = (ImageView) itemView.findViewById(R.id.ivFotoObjeto);
	        	if (itetmImageView != null)
	        	{
        			itetmImageView.setVisibility(View.VISIBLE);
	        		if(poster != null)
		        	{
	        			((ProgressBar) itemView.findViewById(R.id.pBImagen)).setVisibility(View.INVISIBLE);
	        			
	        			itetmImageView.setImageBitmap(poster);
	        			elArticulo.setFotoArticulo(poster);
	        			lista_total.actualizarArticulo(elArticulo);
	        			ListaArticuloCache.getInstance().getListaArticulo().actualizarArticulo(elArticulo);
		        	}
	        	}
	        }*/
	        
			View itemView = null;
			ImageView itetmImageView = null;
			int index_list_v = listViewArticulo.getFirstVisiblePosition();
			int index_real = index - index_list_v;
			Articulo elArticulo = lista_filtro.getArticuloAtIndex(index);
	        //agarra el listview y me devuelve el item en una posicion donde se encuentra
	        if(listViewArticulo != null)
	        {
        		itemView = listViewArticulo.getChildAt(index_real);
	        }
	        
	        if (poster == null)
	        {
	        	poster = BitmapFactory.decodeResource(MainRecursosHumanosActivity.getAppContext().getResources(), R.drawable.avatar_blank);
	        }
	        
	        if (itemView != null)
	        {
	        	itetmImageView = (ImageView) itemView.findViewById(R.id.ivFotoObjeto);
	        	if (itetmImageView != null)
	        	{
        			itetmImageView.setVisibility(View.VISIBLE);
	        		if(poster != null)
		        	{
	        			((ProgressBar) itemView.findViewById(R.id.pBImagen)).setVisibility(View.INVISIBLE);
	        			itetmImageView.setImageBitmap(poster);
	        			elArticulo.setFotoArticulo(poster);
	        			lista_total.actualizarArticulo(elArticulo);
	        			ListaArticuloCache.getInstance().getListaArticulo().actualizarArticulo(elArticulo);
	        				
		        	}
	        	}
	        }
	        
		}
    }
	
}
